package es.albarregas.modelo;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.PropertyUtilsBean;

import es.albarregas.beans.ClienteBean;
import es.albarregas.beans.LineaPedidoBean;
import es.albarregas.beans.PedidoBean;
import es.albarregas.dao.CategoriasDAO;
import es.albarregas.dao.ClienteDAO;
import es.albarregas.dao.ColeccionesDAO;
import es.albarregas.dao.DescuentosDAO;
import es.albarregas.dao.EstadosDAO;
import es.albarregas.dao.FacturaDAO;
import es.albarregas.dao.GastosEnviosDAO;
import es.albarregas.dao.IvaDAO;
import es.albarregas.dao.LineaPedidoDAO;
import es.albarregas.dao.PedidoDAO;
import es.albarregas.dao.PoblacionesDAO;
import es.albarregas.dao.ProductoDAO;
import es.albarregas.dao.ProvinciasDAO;
import es.albarregas.dao.UsuarioDAO;
import es.albarregas.pojo.Categoria;
import es.albarregas.pojo.Coleccion;
import es.albarregas.pojo.Descuentos;
import es.albarregas.pojo.GastoEnvio;

import es.albarregas.pojo.Estado;
import es.albarregas.pojo.Factura;
import es.albarregas.pojo.Iva;
import es.albarregas.pojo.LineaPedido;
import es.albarregas.pojo.Pedido;
import es.albarregas.pojo.Poblacion;
import es.albarregas.pojo.Provincia;

public class ModelFacade {

    public static Cliente crearCliente(ClienteBean bean, boolean crear) {
	Cliente cliente = new Cliente();
	UsuarioDAO udao = new UsuarioDAO();
	ClienteDAO cdao = new ClienteDAO();
	try {
	    PropertyUtilsBean pub = new PropertyUtilsBean();
	    pub.copyProperties(cliente, bean);
	} catch (IllegalAccessException ex) {
	    ex.printStackTrace();
	} catch (java.lang.reflect.InvocationTargetException ex) {
	    System.out.println("Error al copiar datos");
	    ex.printStackTrace();
	} catch (NoSuchMethodException ex) {
	    ex.printStackTrace();
	}
	if (crear) {
	    udao.crearUsuario(cliente);
	    cdao.crearCliente(cliente);
	} else {
	    udao.actualizarUsuario(cliente);
	    cdao.actualizarCliente(cliente);
	}
	return cliente;
    }

    public static Collection<Cliente> getCliente(String clausulaWhere) {
	UsuarioDAO udao = new UsuarioDAO();
	Collection<Cliente> clientes = udao.leerUsuarioCliente(clausulaWhere);
	System.out.println("coleccion en ModelFacade " + clientes.isEmpty());
	return clientes;
    }

    public static Collection<Producto> getProducto(String clausulaWhere) {
	ProductoDAO pdao = new ProductoDAO();
	Collection<Producto> productos = pdao.leerProducto(clausulaWhere);
	System.out.println("coleccion en ModelFacade " + productos.isEmpty());
	return productos;
    }

    public static void borrarProducto(String clausulaWhere) {
	ProductoDAO productoDAO = new ProductoDAO();
	productoDAO.BorrarProducto(clausulaWhere);
    }

    public static void actualizarProducto(Producto nuevoProducto) {
	ProductoDAO productoDAO = new ProductoDAO();
	productoDAO.updateProducto(nuevoProducto);
    }

    public static void actualizarProducto(HttpServletRequest request) {
	ProductoDAO productoDAO = new ProductoDAO();
	productoDAO.updateProducto(request);
    }

    public static Pedido crearPedido(PedidoBean pedidoBean) {
	Pedido pedido = new Pedido();
	PedidoDAO pdao = new PedidoDAO();
	try {
	    PropertyUtilsBean pub = new PropertyUtilsBean();
	    pub.copyProperties(pedido, pedidoBean);
	} catch (IllegalAccessException ex) {
	    ex.printStackTrace();
	} catch (java.lang.reflect.InvocationTargetException ex) {
	    System.out.println("Error al copiar datos");
	    ex.printStackTrace();
	} catch (NoSuchMethodException ex) {
	    ex.printStackTrace();
	}
	pedido = pdao.crearPedido(pedido);
	return pedido;
    }

    public static Collection<Pedido> getPedido(String clausulaWhere) {
	PedidoDAO pddao = new PedidoDAO();
	Collection<Pedido> pedidos = pddao.leerPedido(clausulaWhere);
	return pedidos;
    }

    public static Pedido getPedidoEstadoN(String numeroPedido) {
	PedidoDAO pddao = new PedidoDAO();
	Pedido pedido = pddao.leerUnPedidoEstadoN(numeroPedido);
	return pedido;
    }

    public static Pedido getPedidoWhere(String numeroPedido) {
	PedidoDAO pddao = new PedidoDAO();
	Pedido pedido = pddao.leerUnPedidoWhere(" where numeroPedido="
		+ numeroPedido);
	return pedido;
    }

    public static void borrarPedido(String clausulaWhere) {
	PedidoDAO pedidoDAO = new PedidoDAO();
	pedidoDAO.BorrarPedido(clausulaWhere);
    }

    public static Collection<LineaPedido> getLineaPedido(String clausulaWhere) {
	LineaPedidoDAO lpdao = new LineaPedidoDAO();

	Collection<LineaPedido> lineasPedido = lpdao
		.leerLineaPedido(clausulaWhere);
	return lineasPedido;
    }

    public static int updateLineaPedido(LineaPedidoBean lineaPedidoBean,
	    boolean crear) {
	LineaPedido lineaPedido = new LineaPedido();
	LineaPedidoDAO lpdao = new LineaPedidoDAO();

	try {
	    PropertyUtilsBean pub = new PropertyUtilsBean();
	    pub.copyProperties(lineaPedido, lineaPedidoBean);
	} catch (IllegalAccessException ex) {
	    ex.printStackTrace();
	} catch (java.lang.reflect.InvocationTargetException ex) {
	    System.out.println("Error al copiar datos");
	    ex.printStackTrace();
	} catch (NoSuchMethodException ex) {
	    ex.printStackTrace();
	}
	if (crear)
	    return lpdao.crearLineaPedido(lineaPedido);
	else
	    return lpdao.updateLineaPedido(lineaPedido);
    }

    public static int updateLineaPedidoCompleta(LineaPedidoBean lineaPedidoBean) {
	LineaPedido lineaPedido = new LineaPedido();
	LineaPedidoDAO lpdao = new LineaPedidoDAO();

	try {
	    PropertyUtilsBean pub = new PropertyUtilsBean();
	    pub.copyProperties(lineaPedido, lineaPedidoBean);
	} catch (IllegalAccessException ex) {
	    ex.printStackTrace();
	} catch (java.lang.reflect.InvocationTargetException ex) {
	    System.out.println("Error al copiar datos");
	    ex.printStackTrace();
	} catch (NoSuchMethodException ex) {
	    ex.printStackTrace();
	}

	return lpdao.updateLineaPedidoCompleta(lineaPedido);
    }

    public static int updateLineaPedidoCompleta(LineaPedido lineaPedido) {
	LineaPedidoDAO lpdao = new LineaPedidoDAO();
	return lpdao.updateLineaPedidoCompleta(lineaPedido);
    }

    public static void borrarLineaPedido(String clausulaWhere) {
	LineaPedidoDAO lineaPedidoDAO = new LineaPedidoDAO();
	lineaPedidoDAO.BorrarLineaPedido(clausulaWhere);
    }

    public static Collection<Provincia> getProvincia(String clausulaWhere) {
	ProvinciasDAO provinciasDAO = new ProvinciasDAO();
	Collection<Provincia> lineaProvincias = provinciasDAO
		.leerProvincias(clausulaWhere);
	return lineaProvincias;
    }

    public static Collection<Poblacion> getPoblacion(String clausulaWhere) {
	PoblacionesDAO poblacionesDAO = new PoblacionesDAO();
	Collection<Poblacion> lineaPoblaciones = poblacionesDAO
		.leerPoblaciones(clausulaWhere);
	return lineaPoblaciones;
    }

    // ----------------------- CATEGORIA --------------------------------
    public static Collection<Categoria> getCategoria(String clausulaWhere) {
	CategoriasDAO categoriasDAO = new CategoriasDAO();
	return categoriasDAO.leerProducto(clausulaWhere);
    }

    public static int crearCategoria(Categoria categoria) {

	CategoriasDAO cdao = new CategoriasDAO();

	return cdao.crearCategoria(categoria);
    }

    public static int actualizarCategoria(Categoria categoria,
	    String codigoAntiguo) {

	CategoriasDAO catdao = new CategoriasDAO();

	return catdao.actualizarCategoria(categoria, codigoAntiguo);
    }

    public static int eliminarCategoria(String codigo) {

	CategoriasDAO catdao = new CategoriasDAO();

	return catdao.eliminarCategoria(codigo);
    }

    // ----------------------- COLECCION -------------------------
    public static Collection<Coleccion> getColeccion(String clausulaWhere) {
	ColeccionesDAO coleccionesDAO = new ColeccionesDAO();
	return coleccionesDAO.leerColeccion(clausulaWhere);

    }

    public static int eliminarColeccion(String codigo) {

	ColeccionesDAO coldao = new ColeccionesDAO();

	return coldao.eliminarColeccion(codigo);
    }

    public static int crearColeccion(Coleccion coleccion) {

	ColeccionesDAO coldao = new ColeccionesDAO();

	return coldao.crearColeccion(coleccion);
    }

    public static int actualizarColeccion(Coleccion coleccion, String codigoAntiguo) {

	ColeccionesDAO coldao = new ColeccionesDAO();

	return coldao.actualizarColeccion(coleccion,codigoAntiguo);
    }

    public static Collection<Descuentos> getDescuento(String clausulaWhere) {
	DescuentosDAO descuentosDAO = new DescuentosDAO();
	return descuentosDAO.leerDescuento(clausulaWhere);
    }

    public static Collection<GastoEnvio> getGastoEnvio(String clausulaWhere) {
	GastosEnviosDAO gastosEnviosDAO = new GastosEnviosDAO();
	return gastosEnviosDAO.leerGastoEnvio(clausulaWhere);
    }

    public static Collection<Iva> getIva(String clausulaWhere) {
	IvaDAO ivaDao = new IvaDAO();
	return ivaDao.leerIva(clausulaWhere);
    }

    public static void actualizarPedido(Pedido nuevoPedido) {
	PedidoDAO pedidoDAO = new PedidoDAO();
	pedidoDAO.updatePedido(nuevoPedido);
    }

    public static void recalcularPedido(int numeroPedido) {
	PedidoDAO pddao = new PedidoDAO();
	Pedido pedido = pddao.leerUnPedidoWhere(" WHERE numeroPedido="
		+ String.valueOf(numeroPedido));
	if (!pedido.getEstado().equals("N")) {
	    LineaPedidoDAO lpdao = new LineaPedidoDAO();
	    Collection<LineaPedido> lineasPedido = lpdao
		    .leerLineaPedido(" WHERE numeroPedido=" + numeroPedido);
	    Double BaseImponible = 0.0;
	    for (LineaPedido lineaPedido : lineasPedido) {
		BaseImponible += lineaPedido.getPrecioUnitario()
			* lineaPedido.getCantidad();
	    }
	    pedido.setBaseImponible(BaseImponible);

	    DescuentosDAO descuentosDAO = new DescuentosDAO();
	    Collection<Descuentos> listaDescuentos = descuentosDAO
		    .leerDescuento(" where gastoMinimo<=" + BaseImponible
			    + " and gastoMaximo>" + BaseImponible + ";");
	    Integer porcentajeDescuento = 0;
	    String gastosEnvioGratis = "";
	    for (Descuentos descuento : listaDescuentos) {
		porcentajeDescuento = descuento.getPorcentajeDescuento();
		gastosEnvioGratis = descuento.getEnvioGratis();
	    }
	    Double cantidadGastosDeEnvio = 0.0;
	    if (gastosEnvioGratis.equals("NO")) {
		Collection<GastoEnvio> listaGastosEnvio = ModelFacade
			.getGastoEnvio(" where cod_prov="
				+ pedido.getCodigoPostal().substring(0, 2));
		for (GastoEnvio gastoEnvio : listaGastosEnvio) {
		    cantidadGastosDeEnvio = gastoEnvio.getGastoEnvio();
		}
	    }
	    pedido.setGastosDeEnvio(cantidadGastosDeEnvio);
	    pddao.updatePedido(pedido);
	}
    }

    public static Collection<Estado> getEstado(String clausulaWhere) {
	EstadosDAO edao = new EstadosDAO();
	Collection<Estado> estado = edao.leerEstado(clausulaWhere);
	System.out.println("estado en ModelFacade " + estado.isEmpty());
	return estado;
    }

    public static Collection<Factura> getFactura(String clausulaWhere) {
	FacturaDAO facturaDao = new FacturaDAO();
	return facturaDao.leerFactura(clausulaWhere);
    }

    public static void crearFactura(Factura factura) {
	FacturaDAO facturaDAO = new FacturaDAO();
	facturaDAO.crearFactura(factura);
    }

}
